package it.bela.pgcdc.service.impl;

import java.util.List;

import it.bela.pgcdc.common.exception.ServiceException;
import it.bela.pgcdc.common.utils.Utilities;
import it.bela.pgcdc.dao.LavoroDao;
import it.bela.pgcdc.domain.Lavoro;
import it.bela.pgcdc.service.LavoroService;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
@Service
@Transactional(rollbackFor = ServiceException.class)
public class LavoroServiceImpl implements LavoroService {
	
	private static final Logger log = Logger.getLogger(LavoroServiceImpl.class);
	
	@Autowired(required = true)
	private LavoroDao preferenzaDao;
	
	private boolean hasValidKey(Lavoro preferenza) {
		return (preferenza.getId() != 0);
	}

	@Override
	public List<Lavoro> findByExample(Lavoro preferenza) throws ServiceException {
		
		try {
			log.debug("Start list Lavoro");
			
			preferenza = (Lavoro) Utilities.setDefaultParametersSelect(preferenza);
			
			List<Lavoro> list = preferenzaDao.findByExample(preferenza);
			
			log.debug("End list Lavoro");
			
			return list;

		} catch (Exception e) {
			log.debug("findByExample Lavoro failed" + e.getMessage(), e);
			throw new ServiceException(e);
		}
	}

	public List<Lavoro> list() throws ServiceException {
		
		try {
			log.debug("Start list");
			
			Lavoro preferenza = new Lavoro();
			
			preferenza = (Lavoro) Utilities.setDefaultParametersSelect(preferenza);

			List<Lavoro> list = preferenzaDao.findByExample(preferenza);
			
			log.debug("End list");
			
			return list;

		} catch (Exception e) {
			log.debug("findByExample failed" + e.getMessage(), e);
			throw new ServiceException(e);
		}
	}

	public boolean delete(Lavoro preferenza) throws ServiceException {
		log.debug(preferenza.getClass().toString() + " - Start delete");
		
		String message = preferenza.getClass().toString() + " - delete Lavoro failed.";
		try {
			if (!hasValidKey(preferenza)) {
				String messageInner = message + " Oggetto senza id.";
				log.debug(messageInner);
				throw new ServiceException(messageInner);
			}
			
			preferenza = (Lavoro) preferenzaDao.findById(preferenza.getClass(), preferenza.getId());
			preferenzaDao.delete(preferenza);
			
			log.debug(preferenza.getClass().toString() + " - End delete Lavoro");
			return true;
		} catch (Exception e) {
			log.debug(message + e.getMessage(), e);
			throw new ServiceException(e);
		}
	}

	public boolean persist(Lavoro preferenza) throws ServiceException {
		log.debug(preferenza.getClass().toString() + " - Start persist Lavoro");
		
		String message = preferenza.getClass().toString() + " - persist Lavoro failed.";
		try {
			
			preferenza = (Lavoro) Utilities.setDefaultParametersInsert(preferenza);
			preferenzaDao.persist(preferenza);
			
			log.debug(Lavoro.class.toString() + " - End persist Lavoro");
			return true;
		} catch (Exception e) {
			log.debug(message + e.getMessage(), e);
			throw new ServiceException(e);
		}
	}
	
	public boolean save(Lavoro preferenza) throws ServiceException {
		log.debug(preferenza.getClass().toString() + " - Start save Lavoro");
		
		String message = Lavoro.class.toString() + " - save Lavoro failed.";
		try {
			
			preferenza = (Lavoro) Utilities.setDefaultParametersInsert(preferenza);
			preferenzaDao.save(preferenza);
			
			log.debug(Lavoro.class.toString() + " - End save Lavoro");
			return true;
		} catch (Exception e) {
			log.debug(message + e.getMessage(), e);
			throw new ServiceException(e);
		}
	}
	
	public boolean merge(Lavoro preferenza) throws ServiceException {
		log.debug(Lavoro.class.toString() + " - Start merge Lavoro");
		
		String message = Lavoro.class.toString() + " - merge Lavoro failed.";
		try {
			if (!hasValidKey(preferenza)) {
				String messageInner = message + " Oggetto senza id.";
				log.debug(messageInner);
				throw new ServiceException(messageInner);
			}
			
			preferenza = (Lavoro) Utilities.setDefaultParametersUpdate(preferenza);
			preferenzaDao.merge(preferenza);
			
			log.debug(Lavoro.class.toString() + " - End merge Lavoro");
			return true;
		} catch (Exception e) {
			log.debug(message + e.getMessage(), e);
			throw new ServiceException(e);
		}
	}
	
	public Lavoro findById(Class<Lavoro> classe, Long id)throws ServiceException {
		log.debug(Lavoro.class.toString() + " - Start findById Lavoro");
		
		String message = Lavoro.class.toString() + " - findById Lavoro failed.";
		try {
			
			Lavoro preferenza = (Lavoro) preferenzaDao.findById(classe, id);
			
			log.debug(Lavoro.class.toString() + " - End findById Lavoro");
			return preferenza;
		} catch (Exception e) {
			log.debug(message + e.getMessage(), e);
			throw new ServiceException(e);
		}
	}
}
